package com.matrix.app.flux.project.stage.controller;

import com.matrix.app.flux.project.stage.data.StageDto;
import com.matrix.app.flux.project.stage.data.StagePo;
import com.matrix.app.flux.project.stage.service.StageService;
import com.matrix.framework.core.annotation.validation.LogCollector;
import com.matrix.framework.core.common.result.Result;
import com.matrix.framework.core.i18n.I18n;
import com.matrix.framework.core.i18n.MessageConstants;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 项目阶段控制器
 *
 * Copyright © 海平面工作室 版权所有
 *
 * @Author: Leo
 * @Create: 2025/06/02 10:00
 * @Since 1.2
 */
@RestController
@RequestMapping("/project/stage")
public class StageController {

    private final StageService stageService;

    /**
     * 构造函数注入阶段服务
     * @param stageService 阶段服务
     */
    public StageController(StageService stageService) {
        this.stageService = stageService;
    }

    /**
     * 新增项目阶段
     * @param stage 阶段信息
     * @param exchange 请求上下文
     * @return 新增后的阶段信息
     */
    @LogCollector
    @PostMapping("/save")
    public Mono<Result<StagePo>> save(@RequestBody StagePo stage, ServerWebExchange exchange) {
        return stageService.save(stage)
                .map(saved -> Result.ok(saved)
                        .message(I18n.getMessage(MessageConstants.SAVE_SUCCESS)));
    }

    /**
     * 删除项目阶段
     * @param id 阶段ID
     * @param exchange 请求上下文
     * @return 被删除的阶段信息
     */
    @LogCollector
    @DeleteMapping("/delete")
    public Mono<Result<StagePo>> delete(@RequestParam("id") Long id, ServerWebExchange exchange) {
        return stageService.deleteById(id)
                .map(stage -> Result.ok(stage)
                        .message(I18n.getMessage(MessageConstants.DELETE_SUCCESS)));
    }

    /**
     * 获取单个项目阶段信息
     * @param id 阶段ID
     * @return 阶段信息
     */
    @GetMapping("/get")
    public Mono<Result<StagePo>> get(@RequestParam("id") Long id) {
        return stageService.findById(id)
                .map(stage -> Result.ok(stage)
                        .message(I18n.getMessage(MessageConstants.QUERY_SUCCESS)));
    }

    /**
     * 分页获取项目阶段列表
     * @param dto 查询条件及分页参数
     * @return 分页阶段VO对象
     */
    @PostMapping("/list")
    public Mono<Result<StageDto>> list(@RequestBody StageDto dto) {
        return stageService.findStages(dto)
                .map(vo -> Result.ok(vo)
                        .message(I18n.getMessage(MessageConstants.QUERY_SUCCESS)));
    }
} 